/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package co.edu.usbcali.proyectofinal.logica;

import co.edu.usbcali.proyectofinal.dao.IClientesDAO;
import co.edu.usbcali.proyectofinal.dao.ICuentasDAO;
import co.edu.usbcali.proyectofinal.modelo.Cuentas;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author alejandro
 */
@Scope("singleton")
@Service
public class CuentasLogica implements ICuentasLogica {

    @Autowired
    private ICuentasDAO cuentasDAO;
    @Autowired
    private IClientesDAO clientesDAO;

    @Override
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public void crearCuenta(Cuentas cuentas) throws Exception {

        if (cuentas == null) {
            throw new Exception("La cuenta es nula");
        }

        if (cuentas.getClientes() == null) {
            throw new Exception("La cuenta debe estar asociada a un cliente");
        }

        if (cuentas.getCueActiva() == null || cuentas.getCueActiva().trim().equals("")) {
            throw new Exception("El estado de cuenta es obligatorio");
        }

        if (cuentas.getCueClave() == null || cuentas.getCueClave().trim().equals("")) {
            throw new Exception("La clave es obligatoria");
        }

        if (cuentas.getCueNumero() == null || cuentas.getCueNumero().trim().equals("")) {
            throw new Exception("El numero de cuenta es obligatorio");
        }

        if (cuentas.getCueSaldo() == null) {
            throw new Exception("El saldo de la cuenta es obligatorio");
        }

        if (cuentas.getClientes().getCliId() == 0) {
            throw new Exception("");
        }

        Cuentas entity = cuentasDAO.consultarCuentaNumero(cuentas.getCueNumero());
        if (entity != null) {
            throw new Exception("La cuenta ya existe");
        }

        cuentasDAO.crearCuenta(cuentas);
    }

    @Override
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public void modificarCuenta(Cuentas cuentas) throws Exception {

        if (cuentas == null) {
            throw new Exception("La cuenta es nula");
        }

        if (cuentas.getClientes() == null) {
            throw new Exception("La cuenta debe estar asociada a un cliente");
        }

        if (cuentas.getCueActiva() == null || cuentas.getCueActiva().trim().equals("")) {
            throw new Exception("El estado de cuenta es obligatorio");
        }

        if (cuentas.getCueClave() == null || cuentas.getCueClave().trim().equals("")) {
            throw new Exception("La clave es obligatoria");
        }

        if (cuentas.getCueNumero() == null || cuentas.getCueNumero().trim().equals("")) {
            throw new Exception("El numero de cuenta es obligatorio");
        }

        if (cuentas.getCueSaldo() == null) {
            throw new Exception("El saldo de la cuenta es obligatorio");
        }

        if (cuentas.getClientes().getCliId() == 0) {
            throw new Exception("");
        }

        Cuentas entity = cuentasDAO.consultarCuentaNumero(cuentas.getCueNumero());
        if (entity == null) {
            throw new Exception("La cuenta a modificar no existe");
        }

        entity.setClientes(cuentas.getClientes());
        entity.setCueActiva(cuentas.getCueActiva());
        entity.setCueClave(cuentas.getCueClave());

        cuentasDAO.modificarCuenta(entity);

    }

    @Override
    @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
    public void borrarCuenta(Cuentas cuentas) throws Exception {
        if (cuentas == null) {
            throw new Exception("La cuenta no existe");
        }
        if (cuentas.getCueNumero() == null || cuentas.getCueNumero().trim().equals("")) {
            throw new Exception("El numero de cuenta no es valido");
        }

        cuentasDAO.borrarCuenta(cuentas);
    }

    @Override
    @Transactional(readOnly = true)
    public Cuentas consultarCuentaNumero(String cueNumero) throws Exception {
        return cuentasDAO.consultarCuentaNumero(cueNumero);
    }

    @Override
    @Transactional(readOnly = true)
    public List<Cuentas> consultarTodasLasCuentas() throws Exception {
        return cuentasDAO.consultarTodasLasCuentas();
    }

}
